package com.edu.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
public class DownloadController {


/**
 * 处理文件下载请求
 *
 * @param request 用于获取下载文件的请求信息，包括文件名
 * @param response 用于设置响应信息，包括文件流和下载文件的名称
 * @throws IOException 如果文件读写过程中发生错误
 */
    @RequestMapping("/download1")
    public void download1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 从请求中获取文件名
        String fileName = request.getParameter("filename");
        // 拼接得到文件的项目路径
        String path = "/file/"+fileName;
        // 获取文件的绝对路径
        String realPath = request.getServletContext().getRealPath(path);
        // 创建文件对象
        File file = new File(realPath);
        // 创建文件输入流
        InputStream ins = new FileInputStream(file);
        // 设置响应头，告诉浏览器以下载附件的形式处理文件，并设置文件名
        response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode(file.getName(),"utf-8"));
        // 获取响应的输出流
        OutputStream oos = response.getOutputStream();
        // 创建缓冲区
        byte[] buffers = new byte[1024];
        int len = 0;
        // 循环读取文件内容并写入响应的输出流
        while((len=ins.read(buffers))!=-1){
            oos.write(buffers,0,len);
        }
        // 关闭文件输入流和响应输出流
        ins.close();
        oos.close();
    }

    /**
     * ResponseEntity对象 SpringMVC 提供的 响应实体对象
     *  ResponseEntity 对象同时 包含了 响应的状态码 响应头  响应体数据
     */

    @RequestMapping("/download2")
    public ResponseEntity<byte[]> download2(HttpServletRequest request,String filename) throws IOException {
        // 获取文件的相对路径
        String path = "/file/"+filename;
        // 获取文件的绝对路径
        String realPath = request.getServletContext().getRealPath(path);
        // 创建一个文件对象
        File file = new File(realPath);
        // 创建对该文件的输入流
        InputStream ins = new FileInputStream(file);
        // 把上述文件的所有二进制数据转入到 字节数组
        byte[] bytes = new byte[ins.available()];
        // 把所有的信息读入到 bytes
        ins.read(bytes);
        // 创建响应头对象
        HttpHeaders headers = new HttpHeaders();
        // 设置响应格式，告诉浏览器以附件形式下载文件，并编码文件名
        headers.set("content-disposition","attachment;fileName="+ URLEncoder.encode(file.getName(),"utf-8"));
        // 返回响应实体，包含文件数据、响应头和HTTP状态码200（OK）
        return new ResponseEntity<byte[]>(bytes,headers, HttpStatus.OK);
    }
}
